#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;   //将ElemType类型设成char型
//二叉树的声明
typedef struct TuoNode{
    ElemType data;
    struct node *lchild;  //左孩子结点
    struct node *rchild;  //右孩子结点
}BTNode;
//创建二叉树
void CreateBTree(BTNode *&b,char *str)
{
    BTNode *St[MaxSize],*p;
    int top=-1,k,j=0;
    char ch;
    b=NULL;
    ch=str[j];
    while(ch!='\0')
    {
        switch(ch)
        {
            case '(':top++;St[top]=p;k=1;break;  //处理左子树
            case ')':top--;break;   //子树处理完毕
            case ',':k=2;break;    //处理右子树
            default:p=(BTNode *)malloc(sizeof(BTNode));
                    p->data=ch;p->lchild=p->rchild=NULL;
                    if(b==NULL)
                        b=p;   //将p设为二叉树的根节点
                    else
                     {
                         switch(k)
                         {
                             case 1:St[top]->lchild=p;break;
                             case 2:St[top]->rchild=p;break;
                         }
                     }
        }
        j++;ch=str[j];
    }
}
//销毁二叉树    采用递归的思想
void DestroyBTree(BTNode *&b)
{
    if(b!=NULL)
    {
        DestroyBTree(b->lchild);
        DestroyBTree(b->rchild);
        free(b);
    }
}
//查找特定值的结点
BTNode *FindNode(BTNode *b,ElemType x)
{
    BTNode *p;
    if(b==NULL) //判断是否为空
        return NULL;
    else if(b->data==x)
        return b;
    else
     {
         p=FindNode(b->lchild,x)   //采用递归
         if(p!=NULL)
            return p;
        else
            return FindNode(b->rchild,x);
     }
}
//返回指定结点的左孩子指针
BTNode* LchildNode(BTNode *p)
{
    return p->lchild;
}
//返回指定结点的右孩子指针
BTNode* RchildNode(BTNode *p)
{
    return p->rchild;
}
//求二叉树高度
int BTHeight(BTNode *b)
{
    int lchildh,rchildh;
    if(b==NULL)
        return(0);
    else
     {
         lchildh=BTHeight(b->lchild);    //采用递归
         rchildh=BTHeight(b->rchild);
         return(lchildh>rchildh)?(lchildh+1):(rchildh+1);  //加1=加一个根节点
     }
}
//用括号表示法输出二叉树
void DispBTree(BTNode *b)
{
    if(b!=NULL)
    {
        printf("%c",b->data);
        if(b->lchild!=NULL||b->rchild!=NULL)
        {
            printf("(");
            DispBTree(b->lchild);
            if(b->rchild!=NULL)
                printf(",");
            DispBTree(b->rchild);
            printf(")");
        }
    }
}
int main()
{
    BTNode *b,*p,*lp,*rp;
    printf("二叉树基本运算：\n");
    printf("1.创建二叉树\n");
    CreateBTree(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))");
    printf("2.输出二叉树：");
    DispBTree(b);
    printf("\n");
    printf("3.H结点:");
    p=FindNode(b,'H');
    if(p!=NULL)
    {
        lp=LchildNode(p);
        if(lp!=NULL)
            printf("左孩子为%c",lp->data);
        else
            printf("无左孩子");
        rp=RchildNode(p);
        if(rp!=NULL)
            printf("右孩子为%c",rp->data);
        else
            printf("无右孩子");
    }
    printf("\n");
    printf("4.二叉树的高度:%d\n",BTHeight(b));
    printf("释放二叉树b\n");
    DestroyBTree(b);
    return 1;
}